home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 60.zip
/
BS1 part 60
/
Kick Pascal v2.10 d2.adf
/
DEMO
/
Trackdiskdemo.p
< prev
next >
Wrap
Text File
|
1990-11-01
|
4KB
|
159 lines
Program TrackdiskDemo;
Uses ExecIO;
{$incl 'devices/trackdisk.h' }
Var port : ^MsgPort; { Zeiger auf Message-Port }
ioreq : ^IOExtTD; { Zeiger auf erweiterte IO-Request-Struktur }
Procedure OpenTrackdisk (Laufwerksnummer : integer);
Begin
port := CreatePort ('Disk-Device', 0);
ioreq := CreateExtIO (port, SizeOf(IOExtTD));
Open_Device ('trackdisk.device', Laufwerksnummer, ioreq, 0)
End;
Procedure CloseTrackdisk;
Begin
Close_Device (ioreq);
DeleteExtIO (ioreq);
DeletePort (port)
End;
Procedure MotorOn;
Var err: integer;
Begin
With ioreq^.iotd_req Do
Begin
io_Command := TD_MOTOR;
io_Length := 1;
End;
err := DoIO (ioreq)
End;
Procedure MotorOff;
Var err: integer;
Begin
With ioreq^.iotd_req Do
Begin
io_Command := TD_MOTOR;
io_Length := 0;
End;
err := DoIO (ioreq)
End;
Function DiskImLaufwerk : Boolean;
{ Stellt fest, ob Disk in dem Laufwerk, für das das Device
geöffnet wurde. }
Var err : integer;
Begin
{ Nur ein Befehl ohne Parameter: }
ioreq^.iotd_req.io_Command := TD_CHANGESTATE;
err := DoIO (ioreq);
{ Rückgabe erfolgt in "io_Actual": }
DiskImLaufwerk := ioreq^.iotd_req.io_Actual = 0
End;
Function Schreibschutz : Boolean;
{ true, wenn Disk schreibgeschützt }
Var err : integer;
Begin
{ Nur ein Befehl ohne Parameter: }
ioreq^.iotd_req.io_Command := TD_PROTSTATUS;
err := DoIO (ioreq);
{ Rückgabe erfolgt in "io_Actual": }
Schreibschutz := ioreq^.iotd_req.io_Actual <> 0
End;
Function Diskwechsel : Long;
{ Gibt Anzahl der bisherigen Diskettenwechsel an. Der Zähler wird
sowohl beim Einlegen als auch beim Entnehmen einer Disk
hochgezählt! }
Var err : integer;
Begin
{ Nur ein Befehl ohne Parameter: }
ioreq^.iotd_req.io_Command := TD_CHANGENUM;
err := DoIO (ioreq);
{ Rückgabe erfolgt in "io_Actual": }
Diskwechsel := ioreq^.iotd_req.io_Actual
End;
Procedure WriteHex (n: Long; digits:integer);
{ Hexzahl n mit gewünschter Ziffernanzahl ausgeben }
Begin
If digits > 1 Then WriteHex (n shr 4, digits-1);
Write ('0123456789abcdef'.[n and 15 + 1])
End;
Procedure LiesBlock (nr: integer);
{ Einen Block lesen, z. B. 0 für Bootblock, 880 für Root..., und
als kombinierten Hex- und Asciidump ausgeben. }
Type
BufferTyp = Array[1..512] Of Byte; { 1 Block = 512 Bytes }
Var
Buffer : ^Buffertyp;
i, j : integer;
err : integer;
Begin
Buffer := Ptr(Alloc_Mem(SizeOf(BufferTyp),2)); { Chip-RAM }
With ioreq^.iotd_req Do
Begin
io_Command := CMD_READ;
io_Data := Buffer;
io_Length := 512;
io_Offset := 512 * nr { Blockposition in Bytes }
End;
err := DoIO(ioreq);
{ Ergebnis ausgeben: }
If err <> 0 Then
Writeln ('Fehler: ', err)
Else
Begin
Writeln ('Inhalt von Block ', nr, ':');
Writeln;
For i:=0 to 31 Do { 32 Zeilen zu 16 Bytes }
Begin
WriteHex (16*i,4); Write(': ');
For j:=1 to 16 Do
Begin WriteHex (Buffer^[16*i+j], 2); Write (' ') End;
Write (' ');
For j:=1 to 16 Do
If Buffer^[16*i+j] in [32..127, 160..255] Then
Write (Chr(Buffer^[16*i+j])) { druckbare Zeichen ausgeben }
Else
Write ('.'); { sonst Punkt }
Writeln
End;
End;
Free_Mem (Long(Buffer), SizeOf(BufferTyp))
End;
Var drive, block : integer;
Begin
Write ('Laufwerksnummer: '); Readln(drive);
OpenTrackDisk (drive);
If DiskImLaufwerk Then
Begin
Write ('Blocknummer: '); Readln(block);
Writeln;
LiesBlock (block)
End
Else
Writeln ('Bedaure, da ist keine Disk ''drin!');
CloseTrackdisk
End.